package com.tianji.promotion.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.tianji.common.domain.dto.PageDTO;
import com.tianji.promotion.domain.po.Coupon;
import com.tianji.promotion.domain.po.ExchangeCode;
import com.tianji.promotion.domain.query.CodeQuery;
import com.tianji.promotion.domain.vo.ExchangeCodeVO;

/**
 * <p>
 * 兑换码 服务类
 * </p>
 *
 * @author zr
 * @since 2024-07-30
 */
public interface IExchangeCodeService extends IService<ExchangeCode> {

    /**
     * 异步生成优惠券兑换码。
     * <p>
     * 此方法设计为异步执行，目的是为了不阻塞调用线程，提高系统的并发处理能力。
     *
     * @param coupon 优惠券对象，包含生成代码所需的信息。
     *               之所以需要传入优惠券对象，是因为生成代码可能需要基于优惠券的特定属性。
     */
    void asyncGenerateCode(Coupon coupon);

    /**
     * 查询兑换码分页列表
     * <p>
     * 此方法主要用于后台管理系统对兑换码的分页查询，以便更高效地处理大量兑换码信息
     * 它根据传入的查询参数，返回满足条件的兑换码分页数据
     *
     * @param query 兑换码的查询条件，包括页码、每页数量等分页信息，以及可能的筛选条件
     * @return 返回一个PageDTO对象，包含满足条件的兑换码分页数据
     */
    PageDTO<ExchangeCodeVO> queryCodePage(CodeQuery query);

    /**
     * 验证兑换码是否兑换
     *
     * @param serialNum 兑换码id
     * @param mark 标记已兑换
     * @return 是否已经兑换
     */
    boolean updateExchangeMark(long serialNum, boolean mark);

    Long exchangeTargetId(long serialNum);
}
